GVKun编程网logo

php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)

9

如果您想了解php解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于Go生成json、解析

如果您想了解php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于Go生成json、解析json和多维json数组解析、java – 使用JSON.org解析器从HttpClient请求解析JSON、java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析、Java解析JSON并修改属性值:从JSON到JsonObject的逐层解析的有价值的信息。

本文目录一览:

php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)

php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)

$str2=''{"code":200,"datas":{"id":1,"coupon_id":"123","validity":"2018-08-14","is_use":0,"source":"2","create_time":"2018-08-14 15:06:40"}}'';
var_dump(json_decode($str2));  //输出为 NULL

json在线解析器去掉两边单引号是可以解析的

但是实际代码运行,不论是直接json_decode()还是去掉两边单引号都无法解析.

造成这种问题的源头就是bom头,返回的结果是带bom头的utf8格式的数据,因此只要去除bom头就好了,添加一个方法:

function clearBom($str){
   $bom = chr(239).chr(187).chr(191); 
   return str_replace($bom ,'''',$str);     
}

 然后问题就解决了

$str2=''{"code":200,"datas":{"id":1,"coupon_id":"123","validity":"2018-08-14","is_use":0,"source":"2","create_time":"2018-08-14 15:06:40"}}'';
var_dump(json_decode(clearBom($str2)));
 
结果如下:
object(stdClass)#1 (2) {
  ["code"]=>
  int(200)
  ["datas"]=>
  object(stdClass)#2 (6) {
    ["id"]=>
    int(1)
    ["coupon_id"]=>
    string(3) "123"
    ["validity"]=>
    string(10) "2018-08-14"
    ["is_use"]=>
    int(0)
    ["source"]=>
    string(1) "2"
    ["create_time"]=>
    string(19) "2018-08-14 15:06:40"
  }
}

 

Go生成json、解析json和多维json数组解析

Go生成json、解析json和多维json数组解析

go生成和解析json结构是按结构体模式解析的,所以结构体类型一定要多练习熟悉。

完整代码(可以运行):

// +build ignore
package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

type Family struct {
    Persons []Person
}

func main() {
	// 根据结构体生成json
	manJson := Person{
		Name: "Elinx",
		Age:  26,
	}
	man, _ := json.Marshal(manJson)
	fmt.Println(string(man))

	// 解析json到结构体
	jsonStr := []byte(`{"Name":"Elinx","Age":26}`)
	var man2 Person
	json.Unmarshal(jsonStr, &man2)
	fmt.Println(man2)

	// 解析json数组到切片(数组)
	jsonArrStr := []byte(`[{"Name":"Elinx","Age":26}, {"Name":"Twinkle","Age":21}]`)
	var jsonSlice []map[string]interface{}

	json.Unmarshal(jsonArrStr, &jsonSlice)
	fmt.Println(jsonSlice)

	// 解析多维数组
	var f Family

    // 模拟传输的Json数据
    familyJSON := `{"Persons": [{"Name":"Elinx","Age":26}, {"Name":"Twinkle","Age":21}] }`
	
	fmt.Println("======================")

    // 解析字符串为Json
	json.Unmarshal([]byte(familyJSON), &f)
	// 直接输出并不会展示全部层级,原因待考究
	fmt.Println(f)
	// 从新生成json字符串查看真实结构
	jsons, _ := json.Marshal(f)

	fmt.Println(string(jsons))
}

直接解析单键json

可以使用直接json转map结构

// 直接解析json单key结构,不使用结构体
uploadJSON := `{"xxxx": "test","zzzz": "1111111"}`
var jsonSlice2 map[string]interface{}
json.Unmarshal([]byte(uploadJSON), &jsonSlice2)
fmt.Println(jsonSlice2)

参考文献

1.go json字符串转切片
2.golang生成JSON及解析JSON

java – 使用JSON.org解析器从HttpClient请求解析JSON

java – 使用JSON.org解析器从HttpClient请求解析JSON

我试图使用Notes代理解析 JSON,使用Apache HttpClient获取JSON.

这是返回JSON的代码

import lotus.domino.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;

      Session session = getSession();
      AgentContext agentContext = session.getAgentContext();

      HttpClient client = HttpClientBuilder.create().build();
      HttpGet request = new HttpGet("http://api.acme.com/customer");
      request.addHeader("accept","application/json");
      request.addHeader("Host","api.acme.com");
      request.addHeader("X-Api-Version","1.0");
      request.addHeader("Authorization","Basic ...");

      HttpResponse response = client.execute(request);

JSON看起来像这样.

[ 
  { 
    "id": 123456,"insertDate": "2014-05-12T16:51:38.343","read": false,"site": "acme.com","Email": "john.doe@acme.com","location": "/customer/1212?v=1.0" 
  } 
]

我曾尝试使用JSON.org中的JSONObject和JSONArray但无法使其工作
我需要一些来自json.org包的示例代码或其他解析json的方法.

解决方法

您可以使用 HttpResponse#getEntity从HttpResponse中的Entity获取JSON.一旦有了,就可以创建一个新的JSONArray并迭代该数组以访问JSON对象中的值:
String json = IoUtils.toString(response.getEntity().getContent());
JSONArray array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
    JSONObject object = array.getJSONObject(i);
    log.info("the id is {}",object.getInt("id"));
    log.info("the insertDate is {}",object.getString("insertDate"));
    log.info("read is {}",object.getBoolean("read"));
    log.info("the site is {}",object.getString("site"));
    log.info("the Email is {}",object.getString("Email"));
    log.info("the location is {}",object.getString("location"));
}

我在http://jsonblob.com/537a43bfe4b047fa2ef5f15d将JSON保存在JSONBlob中并创建了一个请求JSON的单元测试:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IoUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Test;

@Slf4j
public class JsonTest {
    @Test
    public void test() throws Exception {
        HttpClient client = HttpClientBuilder.create().build();
        HttpGet request = new HttpGet("http://jsonblob.com/api/jsonBlob/537a43bfe4b047fa2ef5f15d");
        request.addHeader("accept","application/json");
        HttpResponse response = client.execute(request);
        String json = IoUtils.toString(response.getEntity().getContent());
        JSONArray array = new JSONArray(json);
        for (int i = 0; i < array.length(); i++) {
            JSONObject object = array.getJSONObject(i);
            log.info("the id is {}",object.getInt("id"));
            log.info("the insertDate is {}",object.getString("insertDate"));
            log.info("read is {}",object.getBoolean("read"));
            log.info("the site is {}",object.getString("site"));
            log.info("the Email is {}",object.getString("Email"));
            log.info("the location is {}",object.getString("location"));
        }
    }
}

运行它的输出是:

11:23:19.508 [main] INFO  JsonTest - the id is 123456
11:23:19.516 [main] INFO  JsonTest - the insertDate is 2014-05-12T16:51:38.343
11:23:19.516 [main] INFO  JsonTest - read is false
11:23:19.516 [main] INFO  JsonTest - the site is acme.com
11:23:19.516 [main] INFO  JsonTest - the Email is john.doe@acme.com
11:23:19.516 [main] INFO  JsonTest - the location is /customer/1212?v=1.0

我使用IOUtils类来转换来自HttpResponse实体的InputStream,但是无论如何你都可以这样做(并且像我那样转换它可能不是最好的想法,具体取决于JSON的大小).

java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析

java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析

1、fastjson
引入包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.16</version>
</dependency>

JSON字符串转JSONObject/JSONArray
JSONObject jsonObject = JSONObject.parseObject(jsonString);
得到子节点
jsonObject .getString();
jsonObject .getArray();
jsonObject .getDate();
.....
转为javaBean
JSONObject.toJavaObject(jsonObject,JavaBean.class);
JSON字符串直接转JavaBean
JSONObject.parseObject(jsonString,javaBean.class);
JavaBean转JSON字符串
String jsonString = JSONObject.toJSONString(javaBean)

2、jackson

引入的包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.0</version>
</dependency>

JSON字符串装javaBean
objectMapper = new ObjectMapper();
JavaBean javaBean= objectMapper.readValue(jsonString, JavaBean.class);

javaBean转JSON字符串
objectMapper = new ObjectMapper();
//writeObject可以转换java对象,eg:JavaBean/Map/List/Array等

String jsonString = objectMapper.writeValueAsString(bean);

控制台打印:

jsonGenerator.writeObject(bean);
//writeValue具有和writeObject相同的功能
objectMapper.writeValue(System.out, bean);

 

获取子节点
ObjectMapper mapper = new ObjectMapper();
// 读取json,将整个json作为根节点
JsonNode node = mapper.readTree(jsonString);

node.path();
node.get();

 

1. //如果属性没有值,那么Json是会处理的,int类型为0,String类型为null,数组为[],设置这个特性可以忽略空值属性
2. mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
3. //让Json可以缩进,可读性更好,一般用在测试和开发阶段。
4. mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
5. //让map的key按自然顺序排列
6. mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
7. //日期输出格式
8. SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
9. mapper.setDateFormat(outputFormat);

创建节点,生成JSON字符串
1. //创建一个提供所有节点的JsonNodeFactory,false表示不创建DecimalNode
2. JsonNodeFactory factory = new JsonNodeFactory(false);
3.
4. // 创建JsonFactory,使用Streaming API的方式输出到控制台
5. JsonFactory jsonFactory = new JsonFactory();
6. JsonGenerator generator = jsonFactory.createGenerator(System.out);
7. ObjectMapper mapper = new ObjectMapper();
8.
9. //创建节点和数据,一个ObjectNode代表一个节点对象
10. ObjectNode node1 = factory.objectNode();
11. ObjectNode node2 = factory.objectNode();
12. node1.put("A", "a");
13. node1.put("B", "b");
14. node2.set("C", node1);
15.
16. // 根节点
17. ObjectNode root = factory.objectNode();
18. root.put("root", "root");
19. root.set("children", node2);
20. mapper.writeTree(generator, root);
21. //输出{"root":"root","children":{"C":{"A":"a","B":"b"}}}

其他数组、list、map参考
http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html
http://blog.csdn.net/gjb724332682/article/details/51586701

 

3、json-lib
使用的包
<!--json-lib-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency>

JSON字符串转JSONObject/JSONArray
JSONObject jsonObject = JSONObject.fromObject(jsonString/javaBean);
得到子节点
jsonObject.getString("success")
转为javaBean
JSONObject.toBean(jsonObject,JavaBean.class);
javaBean转JSON字符串
String jsonString=jsonObject.toString();

list map参照
http://www.cnblogs.com/teach/p/5791029.html

Java解析JSON并修改属性值:从JSON到JsonObject的逐层解析

Java解析JSON并修改属性值:从JSON到JsonObject的逐层解析

哈喽,大家好,我是木头左!

在Java中,可以使用各种库来解析和操作JSON数据。其中,Gson和Jackson是两个非常流行且功能强大的库。在这篇文章中,将使用Gson库来解析给定的JSON字符串,修改operationButtons数组中的第一个元素的isShow属性值为false,然后将修改后的对象转换回JSON字符串。

准备工作:引入Gson库

确保你已经将Gson库添加到项目的依赖中。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

解析JSON为JsonObject

接下来,将使用Gson库将给定的JSON字符串解析为JsonObject对象。需要创建一个JsonParser对象,然后调用其parse()方法。

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

String jsonString = "{\"tableConfig\": {\"toolbar\": {\"batchOperation\": null, \"showRightWidgetSlot\": false, \"displayType\": \"both\", \"operationButtons\": [{\"name\": \"导出\", \"icon\": \"h-icon-export\", \"code\": \"export\", \"value\": \"548a94d7-1024-11ef-ab38-b17b4743f06f\", \"isInner\": true, \"btnType\": \"button\", \"operation\": {\"clickType\": \"custom\", \"pageJump\": null, \"interfaceUrl\": null, \"dialog\": null, \"clickCode\": null, \"secondDialogContent\": null, \"paramFields\": null}, \"mainButton\": false, \"position\": \"left\", \"editAbled\": false, \"isShow\": true, \"configIsShow\": true}]}}";

JsonParser parser = new JsonParser();
JsonObject jsonObject = parser.parse(jsonString).getAsJsonObject();

逐层解析并修改属性值

现在已经有了一个JsonObject对象,接下来需要逐层解析并找到operationButtons数组中的第一个元素的isShow属性,并将其值修改为false

// 获取tableConfig对象
JsonObject tableConfig = jsonObject.getAsJsonObject("tableConfig");
// 获取toolbar对象
JsonObject toolbar = tableConfig.getAsJsonObject("toolbar");
// 获取operationButtons数组
JsonArray operationButtons = toolbar.getAsJsonArray("operationButtons");
// 获取第一个元素
JsonObject firstButton = operationButtons.get(0).getAsJsonObject();
// 修改isShow属性值为false
firstButton.addProperty("isShow", false);

将修改后的JsonObject转换回JSON字符串

需要将修改后的JsonObject对象转换回JSON字符串。可以使用Gson类的toJson()方法来实现这一点。

import com.google.gson.Gson;

Gson gson = new Gson();
String modifiedJsonString = gson.toJson(jsonObject);
System.out.println(modifiedJsonString);

现在,已经成功地修改了JSON字符串中的isShow属性值,并将修改后的对象转换回了JSON字符串。这个过程中,使用了Gson库的强大功能,逐层解析了JSON对象,并修改了指定的属性值。

我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!

今天关于php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)的介绍到此结束,谢谢您的阅读,有关Go生成json、解析json和多维json数组解析、java – 使用JSON.org解析器从HttpClient请求解析JSON、java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析、Java解析JSON并修改属性值:从JSON到JsonObject的逐层解析等更多相关知识的信息可以在本站进行查询。

本文标签: